System.Drawing
var input = File.ReadAllLines(Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), "..", "day22.txt"));
var curY = (input.Length / 2) + 1;
var curX = (input[0].Length / 2) + 1;
var hdg = 0;
// part 1
var grid = new Dictionary();
for (var y = 0; y < input.Length; y++)
for (var x = 0; x < input[y].Length; x++)
grid.Add(new Point(x + 1, input.Length - y), input[y][x] == '#');
var part1 = 0;
for (var burst = 0; burst < 10000; burst++)
{
var pos = new Point(curX, curY);
if (!grid.ContainsKey(pos))
grid.Add(pos, false);
if (grid[pos])
hdg = (hdg + 90) % 360;
else
{
hdg = (hdg + 360 - 90) % 360;
part1++;
}
grid[pos] = !grid[pos];
switch (hdg)
{
case 90: curX++; break;
case 270: curX--; break;
case 0: curY++; break;
case 180: curY--; break;
}
}
part1.Dump();
// part 2
hdg = 0;
curY = (input.Length / 2) + 1;
curX = (input[0].Length / 2) + 1;
var grid2 = new Dictionary();
for (var y = 0; y < input.Length; y++)
for (var x = 0; x < input[y].Length; x++)
grid2.Add(new Point(x + 1, input.Length - y), input[y][x] == '#' ? 'I' : 'C');
var part2 = 0;
for (var burst = 0; burst < 10000000; burst++)
{
var pos = new Point(curX, curY);
if (!grid2.ContainsKey(pos))
grid2.Add(pos, 'C');
switch (grid2[pos])
{
case 'C': grid2[pos] = 'W'; hdg = (hdg + 360 - 90) % 360; break;
case 'I': grid2[pos] = 'F'; hdg = (hdg + 90) % 360; break;
case 'F': grid2[pos] = 'C'; hdg = (hdg + 180) % 360; break;
case 'W': grid2[pos] = 'I'; part2++; break;
}
switch (hdg)
{
case 90: curX++; break;
case 270: curX--; break;
case 0: curY++; break;
case 180: curY--; break;
}
}
part2.Dump();